/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rmiclient;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import rmiserver.Ticket;
import rmiserver.TicketService;
import rmiserver.Trip;

/**
 * Главное окно приложения
 * @author alexxxey
 */
public class MainFrame extends JFrame
{
    public MainFrame(String serverAddr) throws NotBoundException, MalformedURLException, RemoteException
    {
        super("Резервирование билетов");
        
        System.setSecurityManager(new RMISecurityManager());
        m_servCon = (TicketService)Naming.lookup("//"+serverAddr+"/TripService");
                
        setMinimumSize(new Dimension(600, 400));
                
        addWindowListener (
            /**
             * Обработчик событий для окна
             */
            new WindowListener() 
            {            
                @Override
                public void windowClosing(WindowEvent we)
                {
                    System.exit(0);
                }

                @Override
                public void windowClosed(WindowEvent we) { }                                    
                @Override
                public void windowIconified(WindowEvent we) { }
                @Override
                public void windowDeiconified(WindowEvent we) { }
                @Override
                public void windowActivated(WindowEvent we) { }
                @Override
                public void windowDeactivated(WindowEvent we) { }                       
                @Override
                public void windowOpened(WindowEvent we) { }
            });
        
        createMenuBar(); 
        createTabbedPane();
        
        setVisible(true);
    }
    
    /**
     * Создание панели меню
     */
    private void createMenuBar()
    {        
        JMenuBar menuBar = new JMenuBar();

        JMenu fileMenu = new JMenu("Файл");
        JMenuItem quitItem = new JMenuItem("Выход");
        quitItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                System.exit(0);
            }
        });        
        fileMenu.add(quitItem);

        JMenu tripsMenu = new JMenu("Маршруты");
        
        JMenuItem getAllTripsItem = new JMenuItem("Все доступные маршруты");        
        /*
         * Обработчик меню Все доступные маршруты
         * В обработчике происходит щапрос к серверу
         */
        getAllTripsItem.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                try
                {
                    ArrayList<Trip> trips = m_servCon.getAllTrips();
                    m_tripsPanel.addTripList(trips);
                    
                    m_tabbedPane.setSelectedIndex(0);
                } 
                catch (RemoteException ex)
                {
                    JOptionPane.showMessageDialog(null,
                            "Ошибка обращения к серверу! Завершение программы...",
                            "Error!",
                            JOptionPane.ERROR_MESSAGE);

                    System.exit(-1);
                }
            }
        });
        
        JMenuItem findTripsDest = new JMenuItem("Поиск по назначению");
        /*
         * Обработчик поиска маршрутов по назначению
         * В обработчике происходит запрос к серверу
         */
        findTripsDest.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                try
                {  
                    String dest = JOptionPane.showInputDialog(null, 
                            "Введите место назначения", 
                            "Место назначения");
                    
                    if (dest != null)
                    {
                        ArrayList<Trip> trips = m_servCon.findTrip(dest);
                        m_tripsPanel.addTripList(trips);
                    
                        m_tabbedPane.setSelectedIndex(0);
                    }                                                            
                } 
                catch (RemoteException ex)
                {
                    JOptionPane.showMessageDialog(null,
                            "Ошибка обращения к серверу! Завершение программы...",
                            "Error!",
                            JOptionPane.ERROR_MESSAGE);

                    System.exit(-1);
                }
            }
        });
        
        JMenuItem findTripsDate = new JMenuItem("Поиск по дате");
        /*
         * Обработчик поиска маршрутов по дате
         * В обработчике происходит запрос к серверу
         */
        findTripsDate.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                try
                {
                    SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
                    
                    String strDate = JOptionPane.showInputDialog(null, 
                            "Введите дату маршрута", 
                            "dd.MM.yyyy");
                    if (strDate != null)
                    {        
                        Date date = format.parse(strDate); 

                        ArrayList<Trip> trips = m_servCon.findTrip(date);
                        m_tripsPanel.addTripList(trips);

                        m_tabbedPane.setSelectedIndex(0);
                    }
                } 
                catch (ParseException ex)
                {
                    JOptionPane.showMessageDialog(null,
                            "Неправильный формат данных",
                            "Error",
                            JOptionPane.ERROR_MESSAGE);
                }
                catch (Exception ex)
                {
                    JOptionPane.showMessageDialog(null,
                            "Ошибка обращения к серверу! Завершение программы...",
                            "Error!",
                            JOptionPane.ERROR_MESSAGE);

                    System.exit(-1);
                }
            }

            private void MaskFormatter(String string)
            {
                throw new UnsupportedOperationException("Not yet implemented");
            }
        });
        
        tripsMenu.add(getAllTripsItem);
        tripsMenu.add(findTripsDest);
        tripsMenu.add(findTripsDate);
        
        JMenu ticketsMenu = new JMenu("Билеты");
        JMenuItem reserveTicketItem = new JMenuItem("Зарезервировать билет");
        /*
         * Резервирование билета на выбраный маршрут
         * В обработчике происходит запрос к серверу
         */
        reserveTicketItem.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                if (m_tripsPanel.getSelectionTrip() != null)
                {
                    try
                    {
                        Trip trip = m_tripsPanel.getSelectionTrip();
                        
                        // Получаем список свободных мест
                        ArrayList<Integer> freePlaces = new ArrayList<>();                        
                        ArrayList<Integer> places = m_servCon.getPlaces(trip.getTripId());
                        int placeNum = trip.getPlacesNum();
                                               
                        // Свободные места есть
                        if (placeNum != places.size())
                        {
                            for (int i = 0; i < placeNum; ++i)
                            {
                                freePlaces.add(i + 1);
                            }

                            for (int i = 0; i < places.size(); ++i)
                            {
                                freePlaces.remove(places.get(i)-1);
                            }                           
                        } 
                        // Свободных мест нет
                        else
                        {
                            JOptionPane.showMessageDialog(null,
                                     "Свободных мест нет",
                                     "Inane error",
                                     JOptionPane.ERROR_MESSAGE);
                        }
                        
                        ReserveTicketDialog d = new ReserveTicketDialog(trip, freePlaces);                                                
                        if (d.isOk())
                        {                                                                        
                            m_servCon.reserveTicket(
                                    d.getTicket());   
                        }
                    } 
                    catch (NumberFormatException ex)
                    {
                        JOptionPane.showMessageDialog(null,
                                     "Неправильный формат данных",
                                     "Error",
                                     JOptionPane.ERROR_MESSAGE);
                    }
                    catch (Exception ex)
                    {
                        JOptionPane.showMessageDialog(null,
                                     "Ошибка обращения к серверу! Завершение программы...",
                                     "Error",
                                     JOptionPane.ERROR_MESSAGE);
                        
                        System.exit(-1);
                    }                                        
                }
            }
        });
        
        JMenuItem allReserveTicketItem = new JMenuItem("Все зарезервированные билеты");
        /*
         * Список всех зарезервированных билетоа на конкретного пользователя
         * В обработчике происходит запрос к серверу
         */
        allReserveTicketItem.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                try
                {
                    NumberFormat nf = NumberFormat.getInstance();
                    nf.setMinimumIntegerDigits(6);
                    nf.setMaximumIntegerDigits(6);                    
                    
                    String paspStr = JOptionPane.showInputDialog(null, 
                            "Веедите номер паспорта", 
                            "******");
                    
                    if (paspStr != null)
                    {                                
                        m_ticketsPanel.addTicketList(
                            m_servCon.getReservedTickets(nf.parse(paspStr).intValue()));                        
                    }                                                            
                                        
                    m_tabbedPane.setSelectedIndex(1);
                } 
                catch (ParseException ex)
                {
                    JOptionPane.showMessageDialog(null,
                            "Неправильный формат данных",
                            "Error",
                            JOptionPane.ERROR_MESSAGE);                   
                }
                catch (RemoteException ex)
                {
                    JOptionPane.showMessageDialog(null,
                            "Ошибка обращения к серверу! Завершение программы...",
                            "Error",
                            JOptionPane.ERROR_MESSAGE);

                    System.exit(-1);
                }
            }
        });
        
        JMenuItem cancelReserveItem = new JMenuItem("Отменить резервирование");
        /*
         * Отмена резервирования выбранного билета
         * В обработчике происходит запрос к серверу
         */
        cancelReserveItem.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                try
                {
                    Ticket t = m_ticketsPanel.getSelectionTicket();
                    if (t != null)
                    {
                        String info = "Маршрут № " + t.getTripId() + "\n" +
                                "Место " + t.getPlace();
                        int res = JOptionPane.showConfirmDialog(null,
                                info,
                                "Отмена резервирования",
                                JOptionPane.YES_NO_OPTION);
                        
                        if (res == JOptionPane.YES_OPTION)
                        {
                            m_servCon.cancelReserveTicket(t);
                            
                        }
                                                
                    }                    
                } 
                catch (RemoteException ex)
                {
                    JOptionPane.showMessageDialog(null,
                            "Ошибка обращения к серверу! Завершение программы...",
                            "Error",
                            JOptionPane.ERROR_MESSAGE);

                    System.exit(-1);
                }
            }
        });
        
        ticketsMenu.add(reserveTicketItem);
        ticketsMenu.add(allReserveTicketItem);
        ticketsMenu.add(cancelReserveItem);        
        
        JMenu helpMenu = new JMenu("Справка");
        JMenuItem helpItem = new JMenuItem("Справка");
        JMenuItem aboutItem = new JMenuItem("О программе");
        helpMenu.add(helpItem);
        helpMenu.addSeparator();
        helpMenu.add(aboutItem);
       
        menuBar.add(fileMenu);
        menuBar.add(tripsMenu);
        menuBar.add(ticketsMenu);
        menuBar.add(helpMenu);
        
        this.setJMenuBar(menuBar);
    }        
    
    /**
     * Создание панели меню
     */
    private void createTabbedPane()
    {
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());
           
        m_tabbedPane = new JTabbedPane();
        
        m_tripsPanel = new TripsPanel();
        m_tabbedPane.addTab("Маршруты", m_tripsPanel);
        
        m_ticketsPanel = new TicketsPanel();
        m_tabbedPane.addTab("Билеты", m_ticketsPanel);
        
        contentPane.add(m_tabbedPane, BorderLayout.CENTER);                
    }
    
    private JTabbedPane m_tabbedPane;
    private TripsPanel m_tripsPanel;
    private TicketsPanel m_ticketsPanel;
    
    public TicketService m_servCon;
}
